//子类对象构造时，需要先调用基类构造方法，然后执行子类的构造方法。
class Animals{
    public String name;
    public int age;
    public String color;

    public Animals(String name) {
        this.name = name;
    }
    public void eat(){
        System.out.println(name + "正在吃饭");
    }
}
class Dog extends Animals{
    public Dog(String name) {
        //this(name);正常的是两者都在第一行，所以说去调用构造方法时候我们让两者同时存在
        super(name);//调用你想要调用的构造方法
        //此时调用父类的构造方法，就相当于先帮助父类进行了初始化
        this.eat();//这个时候就不会报错，只要不去调用构造方法，但是上述的super要在第一行，因为调用父类的构造方法进行初始化
    }
    //当执行完了这个大括号后，那么子类就构造完成了
    //可是我们什么构造方法都不写，那为什么不会报错呢，对于父类和子类；
    //因为在创建类的时候，编译器会默认为我们创建一个不带参数的构造方法。
    //所以父类和子类都有此方法，就不会报错，当我们写了构造方法，那么它就会报错提示
    public void wangWang(){
        System.out.println(this.name + "正在汪汪叫！！");
    }
    /**
     * 注意：
     * 1. 若父类显式定义无参或者默认的构造方法，在子类构造方法第一行默认有隐含的super()调用，即调用基类构
     * 造方法
     * 2. 如果父类构造方法是带有参数的，此时需要用户为子类显式定义构造方法，并在子类构造方法中选择合适的
     * 父类构造方法调用，否则编译失败。
     * 3. 在子类构造方法中，super(...)调用父类构造时，必须是子类构造函数中第一条语句。
     * 4. super(...)只能在子类构造方法中出现一次，并且不能和this同时出现，但是两者可以除了调用构造方法之外的时候
     * 可以哪一个在第一行都可以
     */
}
//当子类继承父类之后，一定要先帮助父类进行构造，然后再构造子类自己
//只能在子类中去调用父类中的构造方法

//子类对象中成员是有两部分组成的，基类继承下来的以及子类新增加的部分 。父子父子
//肯定是先有父再有子，所以在构造子类对象时候，先要调用基类的构造方法，将从基类继承下来的成员构造完整了
//然后再调用子类自己的构造方法，将子类自己新增加的成员初始化完整。

public class TestDemo {
    public static void main(String[] args) {
        Dog dog = new Dog("wby");
        dog.wangWang();
    }
    //super()调用父类的构造方法和this调用类中的其他的方法或者构造方法
    //两者的性质相同，有异曲同工之处

    //super与this的详细解释：
    /*
    相同点：
    1. 都是Java中的关键字
    2. 只能在类的非静态方法中使用，用来访问非静态成员方法和字段
    3. 在构造方法中调用时，必须是构造方法中的第一条语句，并且不能同时存在
     */
    /*
    不同点：
    1. this是当前对象的引用，当前对象即调用实例方法的对象，super相当于是子类对象中从父类继承下来部分成
    员的引用，所以所有的对象的引用都可以用this来进行，但是super只能用于子类中继承于父类的对象的引用
    2. 在非静态成员方法中，this用来访问本类的方法和属性，super用来访问父类继承下来的方法和属性
    3. 在构造方法中：this(...)用于调用本类构造方法，super(...)用于调用父类构造方法，两种调用不能同时在构造
    方法中出现
    4. 构造方法中一定会存在super(...)的调用，用户没有写编译器也会增加(这种是不带参数的构造方法)，但是this(...)用户不写则没有
     */
}
